home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル実用編
/
小遣い帳
/
CSFILE.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
11KB
|
363 lines
/******************************************************************************
* csfile.c: ファイルのロード、セーブ処理関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <stdio.h>
#include <string.h>
#include <doslib.h>
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "cash.h" /* このプログラム固有のヘッダファイル */
#include "csfile.h" /* 小遣い帳データファイルのヘッダファイル */
/******************************************************************************
* loadFile(): 指定の日付のデータをファイルから読み込む
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int month 月
* int day 日
* int *tMoney 金額を格納するポインタ
* char *tInfo 摘要を格納するポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗
*/
BOOLEAN loadFile(ComVal *pcv, int month, int day, int *tMoney, char *tInfo)
{
int i, errCode, len;
short sp;
short index[512]; /* データの位置テーブル */
FILE *hFile; /* ファイルハンドル */
KZDATA kzBuff; /* ファイル1レコードバッファ */
/* ドライブを読み込みモードでチェック */
errCode = checkDrive(pcv->dataFile, 1);
if (errCode < 0) {
if (errCode == -4) {
/* ファイルが見付からない場合 */
DMError(D_CONFIRM, "データファイルが見付かりません。\r"
"新規作成します。");
if(!newFile(pcv))
return FALSE;
clearData(pcv->money, pcv->info[0]);
return TRUE;
} else
/* 読み込みが行えない場合 */
return FALSE;
}
/* ファイルをオープンする */
hFile = fopen(pcv->dataFile, "rb");
if (hFile == NULL) {
/* ファイルがオープンできない */
DMError(D_CONFIRM, "ファイルがオープンできません。");
clearData(tMoney, tInfo);
return FALSE;
}
fseek(hFile, 0, SEEK_SET);
len = fread(index, sizeof(short), 512, hFile);
if (len != 512) {
DMError(D_CONFIRM, "データファイルの構造が異常です。");
fclose(hFile);
return FALSE;
}
/* 指定の日付までのシーク位置を求める */
sp = index[(month - 1) * 32 + (day - 1)];
if (sp == -1) {
/* データ新規作成 */
clearData(tMoney, tInfo);
fclose(hFile);
return TRUE;
}
sp *= sizeof(KZDATA);
if (fseek(hFile, sp + 1024, SEEK_SET)) {
/* データ位置までシークできない */
DMError(D_CONFIRM, "データファイルの構造が異常です。");
fclose(hFile);
return FALSE;
}
/* データの読み込み */
len = fread((unsigned char *) &kzBuff, sizeof(KZDATA), 1, hFile);
if (len != 1) {
/* 読み込みエラーの場合 */
DMError(D_CONFIRM, "ファイルの読み込みに失敗しました。");
clearData(tMoney, tInfo);
fclose(hFile);
return FALSE;
}
/* バッファ内のデータをデュープする */
for (i = 0; i < 7; i++)
tMoney[i] = kzBuff.money[i];
memcpy(tInfo, kzBuff.info, 7 * 21);
/* ファイルをクローズする */
fclose(hFile);
return TRUE;
}
/******************************************************************************
* newFile(): 新規ファイルを作成する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗
*/
BOOLEAN newFile(ComVal *pcv)
{
int i, len;
short index[512];
FILE *hFile;
/* データの位置テーブルを作成する */
for (i = 0; i < 16; i++)
index[i] = -1;
/* 一度にまとめてメモリを塗りつぶす */
for (i = 1; i < 32; i++)
memcpy(&index[i*16], &index[(i - 1) * 16], 32);
/* 新規ファイルとしてオープン */
hFile = fopen(pcv->dataFile, "ab+");
if (hFile == NULL) {
DMError(D_CONFIRM, "ファイルが作成できません。");
return FALSE;
}
/* テーブルをファイルに書き込む */
fseek(hFile, 0, SEEK_SET); /* ファイルの先頭に移動 */
len = fwrite(index, sizeof(short), 512, hFile);
if (len != 512) {
DMError(D_CONFIRM, "ファイルの書き込みができません。");
fclose(hFile);
return FALSE;
}
fclose(hFile);
return TRUE;
}
/******************************************************************************
* readTable(): データファイル内の位置テーブルを読み出す
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗
* 注釈:
* 小遣い帳データの配置情報のテーブルをデータファイルより読み出します。
*/
BOOLEAN readTable(ComVal *pcv, short *index)
{
int errCode, len;
FILE *hFile;
/* ドライブを読み込みモードでチェック */
errCode = checkDrive(pcv->dataFile, 1);
if (errCode < 0) {
if (errCode == -4)
DMError(D_CONFIRM, "データファイルが存在しません。");
return FALSE; /* 読み込みが行えない場合 */
}
/* ファイルをオープンする */
hFile = fopen(pcv->dataFile, "rb");
if (hFile == NULL) {
/* ファイルがオープンできない */
DMError(D_CONFIRM, "ファイルがオープンできません。");
return FALSE;
}
len = fread(index, sizeof(short), 512, hFile);
if (len != 512) {
DMError(D_CONFIRM, "データファイルの構造が異常です。");
fclose(hFile);
return FALSE;
}
fclose(hFile);
return TRUE;
}
/******************************************************************************
* saveFile(): 指定の日付のデータをファイルにセーブする
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int month 月
* int day 日
* int *tMoney 金額を格納するポインタ
* char *tInfo 摘要を格納するポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗
*/
BOOLEAN saveFile(ComVal *pcv, int month, int day, int *tMoney, char *tInfo)
{
int errCode, len;
short sp, index[512];
long flen; /* ファイルのサイズ */
FILE *hFile; /* ファイルハンドル */
/* ドライブを書き込みモードでチェック */
errCode = checkDrive(pcv->dataFile, 0);
if (errCode < 0) {
if (errCode == -4)
/* ファイルが見付からないので新規にファイルを作成する */
/* データの位置テーブルを作成する */
return newFile(pcv);
else
/* 書き込みが行えない場合 */
return FALSE;
} else
/* 既存のファイルをオープン */
hFile = fopen(pcv->dataFile, "rb+");
if (hFile == NULL) {
errSaveFile(NULL, 1); /* エラーメッセージを表示する */
return FALSE;
}
/* ファイルの位置を先頭に移動 */
fseek(hFile, 0, SEEK_SET);
/* データの位置テーブルを読み込む */
len = fread(index, sizeof(short), 512, hFile);
if (len != 512) {
/* 読み込みエラーの場合 */
errSaveFile(hFile, 2); /* エラーメッセージを表示する */
return FALSE;
}
sp = index[(month - 1) * 32 + (day - 1)];
if (sp == -1) {
/* 新規のデータの場合 */
if (fseek(hFile, 0, SEEK_END)) {
/* データ位置までシークできない */
errSaveFile(hFile, 2); /* エラーメッセージを表示する */
return FALSE;
}
/* 新規データの書き込み位置 */
flen = ftell(hFile);
if (flen < 0) {
/* データ位置までシークできない */
errSaveFile(hFile, 2); /* エラーメッセージを表示する */
return FALSE;
}
sp = (flen - 1024) / sizeof(KZDATA);
/* テーブルをファイルに書き込む */
index[(month - 1) * 32 + (day - 1)] = sp;
fseek(hFile, 0, SEEK_SET);
len = fwrite(index, sizeof(short), 512, hFile);
if (len != 512) {
errSaveFile(hFile, 3); /* エラーメッセージを表示する */
return FALSE;
}
fseek(hFile, 0, SEEK_END);
} else {
sp *= sizeof(KZDATA);
if (fseek(hFile, sp + 1024, SEEK_SET)) {
/* データ位置までシークできない */
errSaveFile(hFile, 2); /* エラーメッセージを表示する */
return FALSE;
}
}
/* ファイルポインタにデータを書き込む */
/* 月 */
len = fwrite((unsigned char *) &month, sizeof(int), 1, hFile);
if (len != 1) {
errSaveFile(hFile, 3); /* エラーメッセージを表示する */
return FALSE;
}
/* 日 */
len = fwrite((unsigned char *) &day, sizeof(int), 1, hFile);
if (len != 1) {
errSaveFile(hFile, 3); /* エラーメッセージを表示する */
return FALSE;
}
/* 金額 */
len = fwrite((unsigned char *) tMoney, sizeof(int), 7, hFile);
if (len != 7) {
errSaveFile(hFile, 3); /* エラーメッセージを表示する */
return FALSE;
}
/* 摘要 */
len = fwrite((unsigned char *) tInfo, sizeof(char), 7 * 21, hFile);
if (len != (7 * 21)) {
errSaveFile(hFile, 3); /* エラーメッセージを表示する */
return FALSE;
}
/* データ量を偶数に補正 */
len = fwrite((unsigned char *) "", sizeof(char), 1, hFile);
if (len != 1) {
errSaveFile(hFile, 3); /* エラーメッセージを表示する */
return FALSE;
}
fclose(hFile);
return TRUE;
}
/******************************************************************************
* errSaveFile(): エラーメッセージを表示してファイルをクローズする
******************************************************************************
* 引数: FILE *hFile クローズするファイルハンドル
* int no エラー番号
*/
void errSaveFile(FILE *hFile, int no)
{
switch (no) {
case 1:
DMError(D_CONFIRM, "ファイルのオープンができません。");
break;
case 2:
DMError(D_CONFIRM, "データファイルの構造が異常です。");
break;
case 3:
DMError(D_CONFIRM, "ファイルの書き込みに失敗しました。");
break;
}
/* ファイルハンドルがNULLでなければファイルをクローズ */
if (hFile)
fclose(hFile);
}
/******************************************************************************
* checkDrive(): 指定ファイル名のドライブをチェック
******************************************************************************
* 引数: char *fname ファイル名へのポインタ
* int mode 検査するモード
* = 0: 書き込み
* = 1: 読み込み
* 戻り値: int >= 0: 読み込み成功
* = -1: ファイル名が正しくない
* = -2: ドライブの準備ができていない
* = -3: 書き込み禁止がされている
* = -4: ファイルが存在しない
*/
int checkDrive(char *fname, int mode)
{
int stat, errCode;
struct NAMECKBUF nminf;
char filbuf[TS_NAMEMAX];
/* 入力されたファイル名を分解・検査 */
stat = NAMECK((unsigned char *) fname, &nminf);
if (stat != 0) {
DMError(D_CONFIRM, "ファイル名が正しくありません。");
return -1;
}
/* フルパス名を作成する */
strmfn(fname, (char *) nminf.drive, (char *) nminf.path, (char *) nminf.name, (char *) nminf.ext);
/* 指定ファイル名のドライブの状態を取得する */
stat = TSDrvctrl(0, nminf.drive[0] & 0x1f);
/* ドライブが準備されているかをチェックする */
if ((stat & 0x06) != 0x02) {
DMError(D_CONFIRM, "ドライブの準備ができていません。");
return -2;
}
/* プロテクトされているかどうかをチェックする */
if (mode == 0 && (stat & 0x0a) == 0x0a) {
DMError(D_CONFIRM, "ライトプロテクトされています。\r"
"書き込みを行うことができません。");
return -3;
}
/* ファイルの存在のチェック */
errCode = TSFiles(filbuf, fname, TS_ARCH);
if (errCode < 0)
/* ファイルの新規作成をする場合を考えて、エラーダイアログは出さない */
return -4;
return 0;
}